﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using ClassLibraryEntidades;

namespace SmartDeviceClient.Negocio
{
    public class LocalizadorSigueRuta: Localizador
    {
        private Ruta ruta;

        private int indice;

        private bool rutavalida;

        private bool comienzo;

        private int paso;
        private int num_pasos;
        private Arco arco_actual;

        public Ruta RutaSeguida
        {
            get { return ruta; }
            set
            {
                ruta = value;
                indice = 0;
                comienzo = true;
                paso = 0;
                num_pasos = 0;
            }
        }
        public Transporte.TipoTransporte TipoTransporte
        {
            get
            {
                return arco_actual.transporte.tipoTransporte;
            }
        }

        public LocalizadorSigueRuta()
        {
            this.indice = 0;
            this.paso = 0;
            this.num_pasos = 0;
            this.comienzo = true;
            arco_actual = null;
        }
        
        #region Localizador Members

        public Coordenada DamePosicion()
        {
            if (!rutavalida) return new Coordenada();

            if ((paso==num_pasos) && (indice < ruta.arcos.Count))
            {
                paso = 0;
                arco_actual = ruta.arcos[indice];
                num_pasos = (int)Distancia()/2;
                indice++;
            }
            return DameSiguiente();
        }

        private Coordenada DameSiguiente()
        {
            Coordenada punto = new Coordenada();


            punto.x = arco_actual.origen.coordenadas.x + (arco_actual.destino.coordenadas.x - arco_actual.origen.coordenadas.x) * paso / num_pasos;
            punto.y = arco_actual.origen.coordenadas.y + (arco_actual.destino.coordenadas.y - arco_actual.origen.coordenadas.y) * paso / num_pasos;

            if (paso != num_pasos)
                paso++;


            return punto;
 
        }

        private int Distancia()
        {
            double cuadrado_x, cuadrado_y;
            double diferencia;
            cuadrado_x = Math.Pow(arco_actual.destino.coordenadas.x - arco_actual.origen.coordenadas.x, 2);
            cuadrado_y = Math.Pow(arco_actual.destino.coordenadas.y - arco_actual.origen.coordenadas.y, 2);
            diferencia = Math.Sqrt(cuadrado_x + cuadrado_y);
            return (int)diferencia;
        }

        #endregion

        public bool AbrirPuerto()
        {
            indice = 0;
            rutavalida = false;
            if (ruta == null)
            {
                return false;
            }
            if (ruta.arcos.Count < 1)
            {
                return false;
            }

            rutavalida = true;
            return true;
        }

        public bool CerrarPuerto()
        {
            indice = 0;
            rutavalida = false;
            return true;
        }

    }
}
